﻿// 文件路径: ViewModels/RoomItemViewModel.cs
using Autodesk.Revit.DB;
using CommunityToolkit.Mvvm.ComponentModel;
using RevitProject.SpaceManager.Models; // 引用包含 RoomDataModel 的命名空间
using System;
using System.Diagnostics;
using System.Globalization;
using System.Collections.Specialized; // 需要 NotifyCollectionChangedAction
using System.ComponentModel;
namespace RevitProject.SpaceManager.ViewModel.NavRoomVmPart
{
    /// <summary>
    /// 表示 NavRoomView 的 DataGrid 中单行房间信息的 ViewModel。
    /// </summary>
    public partial class RoomItemViewModel : ObservableObject
    {
        #region 私有字段 Private Fields

        /// <summary>
        /// 关联的房间原始数据模型。
        /// </summary>
        private readonly RoomDataModel _roomData;

        private bool _isSelected;
        private string _categoryName;
        #endregion


        #region 公共只读属性 Public Readonly Properties (Derived from Model)

        /// <summary>
        /// 指示此房间行在 DataGrid 中是否被选中。
        /// </summary>
        public bool IsSelected
        {
            get => _isSelected;
            set => SetProperty(ref _isSelected, value); // 使用 SetProperty 实现通知
        }

        /// <summary>
        /// 房间的类别名称。此属性可由外部逻辑更新。
        /// </summary>
        public string CategoryName
        {
            get => _categoryName;
            set => SetProperty(ref _categoryName, value); // 使用 SetProperty 实现通知
        }

        /// <summary>
        /// 原始房间数据的 ElementId。
        /// </summary>
        public ElementId RoomId => _roomData?.Id ?? ElementId.InvalidElementId;

        /// <summary>
        /// 房间所在楼层的 ElementId。
        /// </summary>
        public ElementId LevelId => _roomData?.LevelId ?? ElementId.InvalidElementId;

        /// <summary>
        /// 房间编号。
        /// </summary>
        public string RoomNumber => _roomData?.Number ?? "错误";

        /// <summary>
        /// 房间名称。
        /// </summary>
        public string RoomName => _roomData?.Name ?? "错误";

        /// <summary>
        /// 格式化后的房间面积 (平方米, N2 格式)。
        /// </summary>
        public string FormattedArea => FormatArea(_roomData?.AreaInternal);

        /// <summary>
        /// 房间所在楼层的名称。
        /// </summary>
        public string LevelName => _roomData?.LevelName ?? "错误";

        /// <summary>
        /// 格式化后的房间所在楼层的标高 (毫米, F0 格式)。
        /// </summary>
        public string LevelElevation => FormatElevation(_roomData?.LevelElevationInternal);

        /// <summary>
        /// 房间所属的分区名称。
        /// </summary>
        public string ZoneName => _roomData?.ZoneName ?? "无分区";

        /// <summary>
        /// 房间的“部门”参数值。
        /// </summary>
        public string Department => _roomData?.Department ?? "";

        /// <summary>
        /// 房间的“占用”参数值。
        /// </summary>
        public string Occupancy => _roomData?.Occupancy ?? "";

        /// <summary>
        /// 房间的“注释”参数值。
        /// </summary>
        public string Comments => _roomData?.Comments ?? "";

        // 在此添加更多需要从 RoomDataModel 派生并在 DataGrid 中显示的属性...

        #endregion

        #region 构造函数 Constructor

        /// <summary>
        /// 初始化 RoomItemViewModel 的新实例。
        /// </summary>
        /// <param name="roomData">房间的原始数据模型。</param>
        /// <exception cref="ArgumentNullException">当 roomData 为 null 时抛出。</exception>
        public RoomItemViewModel(RoomDataModel roomData)
        {
            _roomData = roomData ?? throw new ArgumentNullException(nameof(roomData));
            // 从传入的 roomData 初始化 CategoryName
            _categoryName = roomData.CategoryName; // CategoryName 是 ObservableProperty，直接赋值即可
        }

        #endregion

        #region 私有辅助方法 Private Helper Methods

        /// <summary>
        /// 格式化面积值。
        /// </summary>
        /// <param name="areaInternal">内部面积值 (平方英尺)。</param>
        /// <returns>格式化后的面积字符串 (平方米, N2 格式) 或 "---"。</returns>
        private string FormatArea(double? areaInternal)
        {
            const string defaultValue = "---";
            if (!areaInternal.HasValue || areaInternal.Value <= 0) return defaultValue;
            try
            {
                // 假设内部单位是平方英尺

                double areaSqMeters = UnitUtils.ConvertFromInternalUnits(areaInternal.Value, UnitTypeId.SquareMeters);

                return $"{areaSqMeters:N2}"; // N2 表示数字格式，保留两位小数
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"RoomItemViewModel 错误: 格式化面积失败 (ID: {RoomId}) - {ex.Message}");
                return "转换错误";
            }
        }

        /// <summary>
        /// 格式化标高值。
        /// </summary>
        /// <param name="elevationInternal">内部标高值 (英尺)。</param>
        /// <returns>格式化后的标高字符串 (毫米, F0 格式) 或 "---"。</returns>
        private string FormatElevation(double? elevationInternal)
        {
            const string defaultValue = "---";
            if (!elevationInternal.HasValue) return defaultValue;
            try
            {
                // 内部单位是英尺
                double elevationMM = UnitUtils.ConvertFromInternalUnits(elevationInternal.Value, UnitTypeId.Millimeters);

                return $"{elevationMM:F0}"; // F0 表示无小数位的数字格式
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"RoomItemViewModel 错误: 格式化标高失败 (ID: {RoomId}) - {ex.Message}");
                return "转换错误";
            }
        }

        #endregion

        #region 重写方法 Overrides

        /// <summary>
        /// 判断指定的对象是否等于当前的 RoomItemViewModel 对象（基于 RoomId）。
        /// </summary>
        /// <param name="obj">要与当前对象进行比较的对象。</param>
        /// <returns>如果指定的对象是 RoomItemViewModel 并且具有相同的 RoomId，则为 true；否则为 false。</returns>
        public override bool Equals(object obj)
        {
            // 检查对象是否为 null 以及类型是否匹配
            if (obj == null || GetType() != obj.GetType())
            {
                return false;
            }

            RoomItemViewModel other = (RoomItemViewModel)obj;

            // 比较 RoomId (ElementId 重载了 == 运算符)
            // 同时处理 RoomId 可能为 InvalidElementId 的情况
            return RoomId == other.RoomId;
        }

        /// <summary>
        /// 返回此 RoomItemViewModel 的哈希代码（基于 RoomId）。
        /// </summary>
        /// <returns>基于 RoomId 的哈希代码。</returns>
        public override int GetHashCode()
        {
            // ElementId 提供了 GetHashCode()
            // 如果 RoomId 可能为 InvalidElementId，其 HashCode 通常是 -1 或 0，是安全的
            return RoomId?.GetHashCode() ?? 0; // 使用 null 条件运算符和 null 合并运算符
        }

        /// <summary>
        /// 返回表示当前对象的字符串。
        /// </summary>
        /// <returns>房间的编号和名称。</returns>
        public override string ToString()
        {
            return $"{RoomNumber} - {RoomName}";
        }

        #endregion
    }
}